AWS VPN Client(AWS Client VPN for Desktop)でプロファイル追加する際に OpenVPN 設定 verify-x509-name 関連のエラーが発生した時の対処方法
コンバンハ、千葉(幸)です。
AWS VPN Client(AWS Client VPN for Desktopとも)は、AWS が提供する AWS Client VPN 用のクライアントツールです。 *1「AWS Client VPN」とぱっと見で見分けがつきづらいので、以降は「AWS VPN クライアント」と表記します。
AWS VPN クライアント for Windows へ、プロファイル(簡単に言えば接続設定)を追加する際にエラーが発生したことがありました。
OpenVPN 設定の行「verify-x509-name server name」には、サポートされていないディレクティブが含まれています。それを OpneVPN 設定から削除します。
このエラーの詳細と、その対処方法を記します。
先にまとめ
- AWS VPN クライアントで
verify-x509-name
ディレクティブに対応したのは以下のバージョン以降- Windows:3.2.0(2023/1/23リリース)
- macOS:3.2.0(2023/1/23リリース)
- Linux:3.4.0(2023/2/14リリース)
- 2023/8 時点では AWS マネジメントコンソールからダウンロードした VPN クライアント設定ファイルに
verify-x509-name
ディレクティブが含まれている(ことがある) *2 - バージョンが対応していない場合、以下のいずれかで対処しよう
- クライアントのバージョンアップを行う(推奨)
verify-x509-name
を削除する
AWS VPN クライアントで発生したエラーの詳細
冒頭の繰り返しとなりますが、発生したエラーメッセージは以下です。
OpenVPN 設定の行「verify-x509-name server name」には、サポートされていないディレクティブが含まれています。それを OpneVPN 設定から削除します。
シチュエーションについて補足します。
- 使用していた AWS VPN クライアント は for Windows のバージョン 3.1.0
- プロファイル追加の際に指定した VPN 設定ファイルは AWS マネジメントコンソールからダウンロードしたままの状態
サーバー証明書の有効期限切れの対応の一環として、以下の作業を行っている途中で発生しました。
- 新しいサーバー証明書の ACM へのインポートを行う
- AWS Client VPN エンドポイントで 1. サーバー証明書の ACM を関連付ける
- AWS マネジメントコンソールから新たな VPN クライアント設定ファイルをダウンロードする
- AWS VPN クライアントにプロファイル追加する際に、 3. のVPN クライアント設定ファイルを指定
「OpenVPN 設定」?
OpenVPN はオープンソースの VPN ソリューションです。
AWS Client VPN への接続には、OpenVPN ベースの VPN クライアントを使用します。(AWS VPN クライアントも OpenVPN ベースです。AWS VPN クライアントがリリースされるまでは、サードパーティの VPN クライアントを用いる必要がありました。)VPN クライアント設定ファイルも OpenVPN の設定ファイルベースで書かれることになります。
AWS VPN クライアントでは OpenVPN のすべての設定がサポートされているわけではありません。ドキュメントではサポートされているディレクティブがリストされています。
AWS が提供するクライアントは、次の OpenVPN ディレクティブをサポートしています。
- auth-user-pass
- ca
- cert
- cipher
- client
- connect-retry
- cryptoapicert (Windows のみ)
- dev
- key
- nobind
- persist-key
- persist-tun
- proto
- remote
- remote-cert-tls
- remote-random-hostname
- reneg-sec
- resolv-retry
- static-challenge
- tun-mtu
- tun-mtu-extra
- verb
ここでサポートされていないディレクティブを含む VPN クライアント設定ファイルを用いようとすると、原則エラーが発生することになります。
(原則、と言っているのは例外があるからで、それは後述します。)
AWS VPN クライアントでエラーが発生した原因と対処方法
今回のエラーが発生した原因は、AWS VPN クライアントのバージョンが古かったことです。先述の通り、3.1.0 を使用していました。
Windows 向けの AWS VPN クライアントでは、バージョン 3.2.0 からverify-x509-name
がサポートされています。
3.1.0 のクライアントとしては、自身でサポートしていないverify-x509-name
ディレクティブが VPN クライアント設定ファイルに含まれていたために、冒頭のエラーが発生したというわけでした。
よって、以下のいずれかで対応可能です。
- クライアントのバージョンアップを行う(推奨)
verify-x509-name
ディレクティブを削除する
前者の場合は、以下から最新バージョンのクライアントをダウンロードするとよいでしょう。クライアントツールを最新に保つに越したことはないので、基本的にはこちらの対応を推奨します。
AWS マネジメントコンソールからダウンロードした VPN クライアント設定ファイル
後者の「verify-x509-name
ディレクティブを削除する」について補足します。
AWS マネジメントコンソールからダウンロードした VPN クライアント設定ファイルは以下のような内容になっています。
client dev tun proto udp remote cvpn-endpoint-xxxxxxxxxxxxx.prod.clientvpn.ap-northeast-1.amazonaws.com 443 remote-random-hostname resolv-retry infinite nobind remote-cert-tls server cipher AES-256-GCM verb 3 <ca> -----BEGIN CERTIFICATE----- (ACMにインポートされたサーバー証明書の中身) -----END CERTIFICATE----- </ca> auth-user-pass reneg-sec 0 verify-x509-name server name
(AWS Client VPN エンドポイントの認証方式で相合認証を用いる場合、この設定ファイルにクライアント証明書の情報を追記することになります。今回のケースではActive Directory認証方式のため、ダウンロードしたままの設定ファイルを用いました。)
末尾のverify-x509-name
ディレクティブが今回のトピックです。今回使用しているサーバー証明書のコモンネームがserver
であるためverify-x509-name {server} name
と値が入っていますが、別の名称を使用している場合は違った値が入ります。
この行を丸ごと削除するか、当該行の先頭に#
をつけてコメントアウトすることでもエラーに対応できます。
とは言え、繰り返しになりますがクライアントのバージョンアップで対応できるのであればそれに越したことはありません。
verify-x509-name ディレクティブの役割は?
このディレクティブが何をしているかを確認しておきます。以下のページが参考になりそうです。
--verify-x509-name args
Accept connections only if a host's X.509 name is equal to name. The remote host must also pass all other tests of verification.Valid syntax:
verify-x509 name type
Which X.509 name is compared to name depends on the setting of type. type can be subject to match the complete subject DN (default), name to match a subject RDN or name-prefix to match a subject RDN prefix. Which RDN is verified as name depends on the --x509-username-field option. But it defaults to the common name (CN),(略)
verify-x509-name 名称 タイプ
の構文で指定します。
タイプは以下のいずれかになります。
subject
name
(今回の設定ファイルで指定されているのはコレ)name-prefix
タイプとしてname
が指定されている際の検証内容はコントロール可能な部分 *3ですが、デフォルトではコモンネームを検証します。
今回であれば、VPN 接続時の相手方のサーバー証明書のコモンネームがserver
と一致するかを検証します。
verify-x509-name
は中間者攻撃に対する対策として有効です。例えば攻撃者がクライアントとサーバーの中間に割り込み、偽のサーバーへ通信を行わせようとしたとします。その際に相手方(偽のサーバー)のサーバー証明書のコモンネームを検証し、定義された内容(今回であればserver
)と異なるようであればクライアントは接続を拒否します。
このディレクティブを削ってセキュリティレベルを下げるよりは、クライアントのバージョンアップで対応した方が望ましいでしょう。
余談:OpenVPN フラグ? OpenVPN ディレクティブ?
これまでverify-x509-name
のことを「ディレクティブ」と呼んできたのですが、AWS VPN クライアントのリリースノートにおいては「フラグ」と呼ばれています。
これまでの機能追加で、「OpenVPN ディレクティブ」と「OpenVPN フラグ」の表現が使い分けられている様子が見てとれます。
ここで「OpenVPN フラグ」と表現されているものについては、先述の「サポートされている OpenVPN ディレクティブ」のリストに含まれていません。
verify-x509-name
のことは「ディレクティブ」と呼ぶ方が個人的にはしっくりくるのですが、正式名称としては異なるかもしれません。
「OpenVPN のこの機能は AWS Client VPNでサポートされているか?」を確認する際には、「ディレクティブ」という切り口だけでなく「フラグ」という切り口でも確認すると良さそうです。
終わりに
AWS VPN クライアントへのプロファイル追加時に設定ファイルのディレクティブ起因のエラーが出る、という内容でした。
最後に VPN クライアント設定ファイルを眺めたのが2022年ごろだったので、verify-x509-name
という見慣れぬディレクティブに少し面食らいました。
AWS VPN クライアントの機能向上にあわせて設定ファイルのデフォルトも変わること、ディレクティブの詳細を確認したい時は OpenVPN のリファレンスを参照すると良いことを学びました。
少しニッチな内容でしたが、同じエラーに直面した方の参考になれば幸いです。
以上、 チバユキ (@batchicchi) がお送りしました。
参考
- Important Note On Possible "Man-in-the-Middle" Attack | OpenVPN
- Simple AD で Active Directory 認証する AWS Client VPN を構築してみた | DevelopersIO
- Client VPN の証明書を置き換えて、TLS ハンドシェイクエラーを解決する | AWS re:Post
- Tunnelblick で VPN 接続できなくなったので対処した | DevelopersIO
- Openvpn23ManPage – OpenVPN Community
- openvpn